
/*
 * 1、认识 async 与 promise 的关系
 * - 必须是执行的状态，也就是 function 后面有 ()
 * 结果：async function 是 Promise 的语法糖封装
 */
const func1 = async function () {
    return 4
}

const func2 = function () {
    return new Promise((resolve, reject) => {
        resolve(4)
    })
}
// 方法执行
console.log(func1())
console.log(func2())

/*
 * 2、异步编程的终极解决方案 - 以同步的方式写异步
 * - await 关键字可以 "暂停" async function（也就是 promise） 的执行
 * - await 可以以同步的写法获取 promise 的执行结果
 * - try catch 可以获取 await 所得到的错误（如果 promise 用 try 包裹，返回一个 reject 错误，底部的 catch 是没法捕获的，错误会抛到全局）
 */
(function() {
    const result = async function() {
        try {
            var content = await new Promise((resolve,reject) => {
                setTimeout(() => {
                    reject(new Error('miss you'))
                }, 500);
            })
        } catch(e) {
            // 这种情况可以捕获错误
            console.log('error')
        }
        console.log(content)
        return 5
    }()
    
    setTimeout(() => {
        console.log(result)
    }, 800);

    // 结果：
    // error
    // undefined
    // Promise {5}
}())


 /*
  * 3、面试的例子：用 async/await 来实现 同步多个任务 与 异步多个任务
  */
(async function() {
    try {
        // 同步的方式
        await interview(1)
        await interview(2)
        // 异步
        // await Promise.all([interview(1), interview(2)])
    }catch(e) {
        // 错误到这里
        return console.log('cry at ' + e.round)
    }
    // 成功会执行这里
    console.log('smile')
})()

// round: 表示第几次调用
function interview(round) {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            if (Math.random() > 0.4) {  
                resolve('success')
            }else {
                reject(new Error('fail').round = round)
            }
        }, 300);
    })
}